package level4.display.players.bitmap_sequence
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.geom.Point;
	import flash.geom.Rectangle;
	import flash.utils.getTimer;
	
	import level4.assets.cache.AssetsDb;
	import level4.display.GameDispose;
	import level4.engines.GameEngine;
	import level4.events.BitmapSequencePlayerEvent;
	import level4.grid_case.astar.test.Player;
	import level4.interfaces.IGameComponent;
	
	/**
	 * 位图序列 播放器
	 * 
	 * */
	public class BitmapSequencePlayer extends GameDispose implements IGameComponent
	{
		/**
		 * 总 帧数
		 * */
		public var totalCount:int = 0;
		/**
		 * 每帧的 间隔时间
		 * 值越小,播放速度越快.
		 * fps: 1s/timeInterval.
		 * */
		public var timeInterval:int = 10;
		/**
		 * 是否 循环播放
		 * 默认 true
		 * */
		public var isLoop:Boolean = true;
		/**
		 * 当前是否处于播放中.
		 * */
		public var isPlaying:Boolean;
		
		/////////////////////////////////////////////
		//内部变量
		/////////////////////////////////////////////
		//原始 位图序列
		private var targetBmd:BitmapData;
		//目标位图
		private var targetBmp:Bitmap;
		//当前行,列的帧数
		private var curCountX:int = 0;
		private var curCountY:int = 0;
		//当前 帧数,x+y.
		private var curCount:int = 0;
		//行,列的总帧数
		private var totalX:int = 0;
		private var totalY:int = 0;
		//逝去的时间.
		private var elapsedTime:int = 0;
		//临时 的顶点
		private const pt:Point = new Point();
		//每帧的 宽,高
		private var frameWidth:int = 0;
		private var frameHeight:int = 0;
		//播放的 帧数组
		private var frames:Array;
		/**
		 * 位图序列播放器
		 * originalBitmapData : 原始的位图序列数据
		 * totalX : x方向,位图个数.
		 * totalY : y方向,位图个数.
		 * 目标: 将 原始位图序列数据,copyPixels 到目标 位图中,每次拷贝一个矩形区域,连续多次,形成动画.
		 * 初始化完毕后,需要加入到 GameEngine的更新列表中.
		 * */
		public function BitmapSequencePlayer(playerName:String,bmd:BitmapData,totalX:int,totalY:int)
		{
			this.totalX = totalX;
			this.totalY = totalY;
			this.targetBmd = AssetsDb.StoreBitmapData(playerName,bmd);
			this.frameWidth = bmd.width/totalX;
			this.frameHeight = bmd.height/totalY;
			//准备好 目标位图
			targetBmp = new Bitmap(new BitmapData(frameWidth,frameHeight));
		}
		//////////////////////
		//初始化 及 回收工作
		//////////////////////
		override public function init(e:Event):void{
			super.init(e);
			addChild(targetBmp);
			if(isPlaying){
				startPlay(frames);
			}
		}
		
		override public function deInit(e:Event):void{
			super.deInit(e);
			stopPlay();
			removeChild(targetBmp);
		}
		
		override public function dispose():void{
			super.dispose();
			stopPlay();
		}
		/**
		 * 开始 播放
		 * frames : 确认要播放的帧数组,null时顺序播放全部
		 * 数组格式为 : [0,0 ,0,1 , 0,2]每一对元素表示要播放的(行,列)数
		 * 序号 : 从0开始.
		 * */
		public function startPlay(frames:Array = null):void{
			this.frames = frames;
			if(frames != null)
				totalCount = frames.length * .5;
			
			if(totalCount == 0){
				throw("totalCount需要指定.");
				return;
			}
			GameEngine.addComponent(this);
			isPlaying = true;
		}
		/**
		 * 停止播放
		 * */
		public function stopPlay():void{
			GameEngine.removeComponent(this);
			isPlaying = false;
		}
		/**
		 * 更新自身,由GameEngine来执行调用
		 * */
		public function update(timeDiff:Number):void{
			elapsedTime += timeDiff;
			if(elapsedTime >= timeInterval){
				elapsedTime = 0;
				//是否为播放 帧数组
				if(frames != null){
					playNextFrame();
				}else{
					autoNextFrame();
				}
				//开始位图区域切换
				targetBmp.bitmapData.copyPixels(targetBmd,new Rectangle(curCountY * frameWidth,curCountX * frameHeight,frameWidth,frameHeight),pt);
				//累计 帧数
				curCount ++;
				//检测 是否播放完毕
				checkIsDone();
			}
		}
		/////////////////////////////////////////////////////
		//私有成员
		/////////////////////////////////////////////////////
		//播放 帧 数组
		private function playNextFrame():void{
			//一次 取一组(2个)帧
			curCountX = frames[curCount * 2];
			curCountY = frames[curCount * 2 + 1];
		}
		//顺序全部播放,下一帧
		private function autoNextFrame():void{
			//增进,列,行.
			curCountY ++;
			if(curCountY > totalX){
				curCountY = 0;
				curCountX ++;
			}
		}
		//检测 是否播放完毕
		private function checkIsDone():void{
			//判断 是否播放完毕
			if(curCount > totalCount-1){
				//派发 播放完毕事件
				dispatchEvent(new BitmapSequencePlayerEvent(BitmapSequencePlayerEvent.PLAY_COMPLETE));
				//重置 变量
				curCount = curCountX = curCountY = 0;
				if(!isLoop){
					stopPlay();
				}
			}
		}

	}
}